package com.zx.servicelearn.service;

import android.app.Service;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Binder;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.IBinder;
import android.os.Message;
import android.util.Log;

import java.io.FileDescriptor;
import java.io.PrintWriter;

public class MyService extends Service {
    String TAG = "MyService";
    MyBinder myBinder;

    public MyService() {
        myBinder = new MyBinder();
    }


    @Override
    public void onCreate() {
        Log.e(TAG, "onCreate");//调用startService或bindService时候会执行一次，第二次调用不会执行
        super.onCreate();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.e(TAG, "onStartCommand");//调用startService时候会执行
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public IBinder onBind(Intent intent) {
        Log.e(TAG, "onBind");//调用bindService时候会执行一次，没有onUnbind则再次调用onBind不会执行！
        return myBinder;
    }


    private void test1(final Handler mainHandler) {
        Log.e(TAG, "testInService begin");//
        try {
            Thread.sleep(6000);//当前线程sleep 6秒，会出现ANR，原因是service属于主线程。
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        Log.e(TAG, "testInService end");//
    }

    private void test2(final Handler mainHandler) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                // 开始执行后台任务
                Log.e(TAG, "testInService begin");//
                try {
                    Thread.sleep(6000);//子线程sleep 6秒，不会会出现ANR，可以使用IntentService来实现
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                Log.e(TAG, "testInService end");//

            }
        }).start();
    }

    private void test3(final Handler mainHandler) {
        HandlerThread mH = new HandlerThread("mH");
        mH.start();
        Handler mHandler = new Handler(mH.getLooper()) {
            @Override
            public void handleMessage(Message msg) {
                switch (msg.what) {
                    case 1:
                        Log.e(TAG, "testInService begin");//
                        try {
                            Thread.sleep(6000);//子线程sleep 6秒，不会会出现ANR，可以使用IntentService来实现
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        if (mainHandler != null) {//主线程跟新UI，
                            // 这里需要重新obtainMessage一个msgMain，不能用msg，否则会报错：msg is in use
                                /*@see #android.os.MessageQueue.enqueueMessage*/
                            Message msgMain = mainHandler.obtainMessage(msg.what, msg.obj);
                            mainHandler.sendMessage(msgMain);
                        }
                        Log.e(TAG, "testInService end");//
                        break;
                    default:
                        break;
                }


            }
        };
        Message msg = mHandler.obtainMessage(1, "create in myService");
        mHandler.sendMessage(msg);
    }


    public class MyBinder extends Binder {
        public MyService getService() {
            return MyService.this;
        }

        /**
         * 该方法写在Binder中，供ServiceConnection的onServiceConnected使用
         *
         * @param mainHandler
         */
        public void testInService(final Handler mainHandler) {
            // 第一种方式：直接耗时操作，出现ANR，说明service属于主线程。
//            test1(mainHandler);
            // 第二种方式：开启一个子线程，耗时操作，没有ANR
//            test2(mainHandler);
            // 第三种方式：使用HandlerThread来进行耗时操作，同样没有ANR，说明：HandlerThread是一个线程，拥有了自己的looper
            test3(mainHandler);
        }
    }

    /**
     * 该方法写在service中，供ServiceConnection的onServiceConnected使用
     *
     * @param mainHandler
     */
    public void testInService2(final Handler mainHandler) {
        test3(mainHandler);

    }

    @Override
    public boolean onUnbind(Intent intent) {
        Log.e(TAG, "onUnbind");//
        return super.onUnbind(intent);
    }

    @Override
    public void onDestroy() {
        Log.e(TAG, "onDestroy");//调用stopService会执行
        super.onDestroy();
    }


}
